2025-03-25 01:13:20,751 - INFO - Num classes: 3
2025-03-25 01:21:21,826 - INFO - Class weights: tensor([0.6006, 2.8061, 1.0217], device='cuda:0')
2025-03-25 01:21:22,084 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-03-25 01:21:22,084 - INFO - Using cuda device
2025-03-25 01:34:20,558 - INFO - Epoch: 0/100. Training time: 499.254
2025-03-25 01:34:20,561 - INFO - Training Metrics...
2025-03-25 01:34:20,561 - INFO - {'loss': 0.87782518271428, 'f1': 56.600153428342416, 'acc': 62.18099550727935, 'precision': 56.972861849183765, 'recall': 62.629316919470604, 'balanced acc': 62.629316919470604}
2025-03-25 01:34:20,561 - INFO - Validation Metrics... Inference time: 279.213
2025-03-25 01:34:20,561 - INFO - {'loss': 0.8351210095943549, 'f1': 73.22862691469396, 'acc': 85.39487159046311, 'precision': 77.12915039295795, 'recall': 72.67977766148583, 'balanced acc': 72.67977766148583}
2025-03-25 01:34:20,561 - INFO - ==================================================
2025-04-01 03:20:00,068 - INFO - Num classes: 3
2025-04-01 03:20:23,521 - INFO - Num classes: 3
2025-04-01 03:25:48,662 - INFO - Class weights: tensor([0.6006, 2.8061, 1.0217], device='cuda:0')
2025-04-01 03:29:31,627 - INFO - Num classes: 3
2025-04-01 03:35:13,480 - INFO - Class weights: tensor([0.6006, 2.8061, 1.0217], device='cuda:0')
2025-04-01 03:35:13,530 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-01 03:35:13,531 - INFO - Using cuda device
2025-04-01 03:35:13,555 - INFO - Training parameters restored at epoch 1
2025-04-01 04:24:59,818 - INFO - Num classes: 3
2025-04-01 04:30:40,193 - INFO - Class weights: tensor([0.6006, 2.8061, 1.0217], device='cuda:0')
2025-04-01 04:59:58,250 - INFO - Num classes: 3
2025-04-01 05:05:44,929 - INFO - Class weights: tensor([0.6006, 2.8061, 1.0217], device='cuda:0')
2025-04-01 05:05:44,983 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-01 05:05:44,983 - INFO - Using cuda device
2025-04-01 05:05:45,008 - INFO - Training parameters restored at epoch 2
2025-04-01 05:43:10,917 - INFO - Epoch: 5/100. Training time: 369.307
2025-04-01 05:43:10,917 - INFO - Training Metrics...
2025-04-01 05:43:10,918 - INFO - {'loss': 0.6268415151128344, 'f1': 72.04008305255462, 'acc': 78.94635088310802, 'precision': 71.2927602369841, 'recall': 78.33817480939538, 'balanced acc': 78.33817480939538}
2025-04-01 05:43:10,918 - INFO - Validation Metrics... Inference time: 193.618
2025-04-01 05:43:10,918 - INFO - {'loss': 0.5652724428054614, 'f1': 71.67818643533606, 'acc': 83.1250408817373, 'precision': 71.7005064539575, 'recall': 76.09637897537958, 'balanced acc': 76.09637897537958}
2025-04-01 05:43:10,918 - INFO - ==================================================
2025-04-01 06:32:13,166 - INFO - Epoch: 10/100. Training time: 367.809
2025-04-01 06:32:13,166 - INFO - Training Metrics...
2025-04-01 06:32:13,167 - INFO - {'loss': 0.5666261368496402, 'f1': 74.21443497890931, 'acc': 80.72736832591318, 'precision': 73.3866883278578, 'recall': 81.22688987301298, 'balanced acc': 81.22688987301298}
2025-04-01 06:32:13,167 - INFO - Validation Metrics... Inference time: 194.364
2025-04-01 06:32:13,168 - INFO - {'loss': 0.5341940430494455, 'f1': 71.13988053412044, 'acc': 82.28001537153321, 'precision': 69.90156585095096, 'recall': 76.32030360176965, 'balanced acc': 76.32030360176965}
2025-04-01 06:32:13,168 - INFO - ==================================================
2025-04-01 07:19:36,653 - INFO - Epoch: 15/100. Training time: 377.204
2025-04-01 07:19:36,654 - INFO - Training Metrics...
2025-04-01 07:19:36,656 - INFO - {'loss': 0.5635049481680439, 'f1': 73.83406747448554, 'acc': 80.67694708257505, 'precision': 73.09026061887353, 'recall': 79.51949470534815, 'balanced acc': 79.51949470534815}
2025-04-01 07:19:36,656 - INFO - Validation Metrics... Inference time: 194.897
2025-04-01 07:19:36,656 - INFO - {'loss': 0.5173833018694168, 'f1': 70.85274443731578, 'acc': 81.85527967196494, 'precision': 69.36367041955329, 'recall': 76.28412764076727, 'balanced acc': 76.28412764076727}
2025-04-01 07:19:36,656 - INFO - ==================================================
2025-04-01 08:06:34,953 - INFO - Epoch: 20/100. Training time: 370.526
2025-04-01 08:06:34,957 - INFO - Training Metrics...
2025-04-01 08:06:34,960 - INFO - {'loss': 0.5522898989877884, 'f1': 72.91004935648373, 'acc': 79.9319897146757, 'precision': 72.85294326679089, 'recall': 78.92625031856957, 'balanced acc': 78.92625031856957}
2025-04-01 08:06:34,960 - INFO - Validation Metrics... Inference time: 192.839
2025-04-01 08:06:34,961 - INFO - {'loss': 0.48909772359407866, 'f1': 72.08652014111637, 'acc': 83.18661899856097, 'precision': 71.62186947111375, 'recall': 76.22618471335466, 'balanced acc': 76.22618471335466}
2025-04-01 08:06:34,961 - INFO - ==================================================
2025-04-01 08:52:42,094 - INFO - Epoch: 25/100. Training time: 359.392
2025-04-01 08:52:42,097 - INFO - Training Metrics...
2025-04-01 08:52:42,101 - INFO - {'loss': 0.5173151853737558, 'f1': 76.09907229851952, 'acc': 82.2300533967568, 'precision': 75.16783524385842, 'recall': 81.66643591019564, 'balanced acc': 81.66643591019564}
2025-04-01 08:52:42,101 - INFO - Validation Metrics... Inference time: 189.897
2025-04-01 08:52:42,101 - INFO - {'loss': 0.4916099562094762, 'f1': 71.91665276849629, 'acc': 83.15881941718996, 'precision': 71.37566069433755, 'recall': 76.2440715773883, 'balanced acc': 76.2440715773883}
2025-04-01 08:52:42,101 - INFO - ==================================================
2025-04-01 09:39:35,227 - INFO - Epoch: 30/100. Training time: 362.902
2025-04-01 09:39:35,230 - INFO - Training Metrics...
2025-04-01 09:39:35,234 - INFO - {'loss': 0.5302648157071156, 'f1': 75.42253505575542, 'acc': 81.50659995287924, 'precision': 75.04401812443264, 'recall': 81.00713667134225, 'balanced acc': 81.00713667134225}
2025-04-01 09:39:35,234 - INFO - Validation Metrics... Inference time: 191.588
2025-04-01 09:39:35,234 - INFO - {'loss': 0.4619608376270685, 'f1': 73.33987266171475, 'acc': 84.76488401851125, 'precision': 74.26174302279152, 'recall': 76.27618590828173, 'balanced acc': 76.27618590828173}
2025-04-01 09:39:35,234 - INFO - ==================================================
2025-04-01 10:25:22,893 - INFO - Epoch: 35/100. Training time: 356.587
2025-04-01 10:25:22,896 - INFO - Training Metrics...
2025-04-01 10:25:22,900 - INFO - {'loss': 0.5361624007012434, 'f1': 73.40791191388158, 'acc': 80.28087628363447, 'precision': 72.76673860095408, 'recall': 78.63004077413844, 'balanced acc': 78.63004077413844}
2025-04-01 10:25:22,900 - INFO - Validation Metrics... Inference time: 187.616
2025-04-01 10:25:22,900 - INFO - {'loss': 0.47492739711052334, 'f1': 72.4157117155164, 'acc': 84.05218758176348, 'precision': 73.66807344569271, 'recall': 76.36804243320114, 'balanced acc': 76.36804243320114}
2025-04-01 10:25:22,900 - INFO - ==================================================
2025-04-01 11:10:52,193 - INFO - Epoch: 40/100. Training time: 360.065
2025-04-01 11:10:52,196 - INFO - Training Metrics...
2025-04-01 11:10:52,200 - INFO - {'loss': 0.5218513513066966, 'f1': 75.00018461280831, 'acc': 80.64177153743664, 'precision': 74.16474594338474, 'recall': 80.2449303846949, 'balanced acc': 80.2449303846949}
2025-04-01 11:10:52,200 - INFO - Validation Metrics... Inference time: 186.786
2025-04-01 11:10:52,200 - INFO - {'loss': 0.48066987899633556, 'f1': 71.9764435597894, 'acc': 83.42437185210623, 'precision': 71.83595622904713, 'recall': 76.7031465573827, 'balanced acc': 76.7031465573827}
2025-04-01 11:10:52,200 - INFO - ==================================================
2025-04-01 11:56:00,465 - INFO - Epoch: 45/100. Training time: 356.532
2025-04-01 11:56:00,468 - INFO - Training Metrics...
2025-04-01 11:56:00,472 - INFO - {'loss': 0.5211095726414091, 'f1': 75.84176631621511, 'acc': 82.31424113236059, 'precision': 75.09556575619315, 'recall': 80.47176877550254, 'balanced acc': 80.47176877550254}
2025-04-01 11:56:00,472 - INFO - Validation Metrics... Inference time: 185.452
2025-04-01 11:56:00,472 - INFO - {'loss': 0.45402058271261364, 'f1': 73.16021219791622, 'acc': 84.5831391450811, 'precision': 73.82588614789573, 'recall': 76.34998823231514, 'balanced acc': 76.34998823231514}
2025-04-01 11:56:00,472 - INFO - ==================================================
2025-04-01 12:41:44,977 - INFO - Epoch: 50/100. Training time: 360.219
2025-04-01 12:41:44,978 - INFO - Training Metrics...
2025-04-01 12:41:44,979 - INFO - {'loss': 0.6379102988607565, 'f1': 68.47499945704408, 'acc': 75.57906995401663, 'precision': 67.56202088371869, 'recall': 76.61958307141818, 'balanced acc': 76.61958307141818}
2025-04-01 12:41:44,979 - INFO - Validation Metrics... Inference time: 188.054
2025-04-01 12:41:44,979 - INFO - {'loss': 0.45282153212107146, 'f1': 72.91527819784113, 'acc': 84.55738365057562, 'precision': 74.31230633500088, 'recall': 76.42350816303536, 'balanced acc': 76.42350816303536}
2025-04-01 12:41:44,979 - INFO - ==================================================
2025-04-01 12:42:43,600 - INFO - Num classes: 3
2025-04-01 12:48:31,118 - INFO - Class weights: tensor([0.6006, 2.8061, 1.0217], device='cuda:0')
2025-04-01 12:48:31,180 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-01 12:48:31,180 - INFO - Using cuda device
2025-04-01 12:48:31,207 - INFO - Training parameters restored at epoch 47
2025-04-01 13:25:23,247 - INFO - Epoch: 50/100. Training time: 364.773
2025-04-01 13:25:23,248 - INFO - Training Metrics...
2025-04-01 13:25:23,249 - INFO - {'loss': 0.5481720020057289, 'f1': 73.29249104771446, 'acc': 79.97652086312232, 'precision': 72.26114592388673, 'recall': 79.4931106709151, 'balanced acc': 79.4931106709151}
2025-04-01 13:25:23,249 - INFO - Validation Metrics... Inference time: 191.674
2025-04-01 13:25:23,249 - INFO - {'loss': 0.4486165864345355, 'f1': 73.16420391537415, 'acc': 84.53357003859236, 'precision': 74.31516006049046, 'recall': 76.29355584301778, 'balanced acc': 76.29355584301778}
2025-04-01 13:25:23,249 - INFO - ==================================================
2025-04-01 14:13:03,854 - INFO - Epoch: 55/100. Training time: 381.799
2025-04-01 14:13:03,855 - INFO - Training Metrics...
2025-04-01 14:13:03,856 - INFO - {'loss': 0.5140985728828771, 'f1': 74.50939726812275, 'acc': 81.11648271968023, 'precision': 73.92702703948962, 'recall': 81.47469921149212, 'balanced acc': 81.47469921149212}
2025-04-01 14:13:03,856 - INFO - Validation Metrics... Inference time: 196.372
2025-04-01 14:13:03,856 - INFO - {'loss': 0.4647635221481323, 'f1': 72.5891779071342, 'acc': 83.77470278976975, 'precision': 72.23479255635958, 'recall': 76.88573106521191, 'balanced acc': 76.88573106521191}
2025-04-01 14:13:03,857 - INFO - ==================================================
2025-04-01 15:00:45,541 - INFO - Epoch: 60/100. Training time: 373.560
2025-04-01 15:00:45,543 - INFO - Training Metrics...
2025-04-01 15:00:45,544 - INFO - {'loss': 0.5270344787722181, 'f1': 74.3235736370561, 'acc': 81.2939472166255, 'precision': 73.93172767835232, 'recall': 79.82158378336351, 'balanced acc': 79.82158378336351}
2025-04-01 15:00:45,544 - INFO - Validation Metrics... Inference time: 199.202
2025-04-01 15:00:45,544 - INFO - {'loss': 0.4701774693452395, 'f1': 72.12388202543767, 'acc': 83.28611492673991, 'precision': 71.38464109482211, 'recall': 77.05574569410426, 'balanced acc': 77.05574569410426}
2025-04-01 15:00:45,544 - INFO - ==================================================
2025-04-01 15:48:25,801 - INFO - Epoch: 65/100. Training time: 376.038
2025-04-01 15:48:25,802 - INFO - Training Metrics...
2025-04-01 15:48:25,803 - INFO - {'loss': 0.5231295004012478, 'f1': 73.46895357018795, 'acc': 80.5527346288834, 'precision': 73.48584012119635, 'recall': 79.43373835502263, 'balanced acc': 79.43373835502263}
2025-04-01 15:48:25,803 - INFO - Validation Metrics... Inference time: 195.934
2025-04-01 15:48:25,803 - INFO - {'loss': 0.451339521469214, 'f1': 73.09784519839123, 'acc': 84.42605106946624, 'precision': 73.46193014062786, 'recall': 76.43425631150886, 'balanced acc': 76.43425631150886}
2025-04-01 15:48:25,803 - INFO - ==================================================
2025-04-01 16:16:56,750 - INFO - Early stopping criterion met. Stopping training.
2025-04-01 16:16:57,512 - INFO - Initializing final Evaluations:

2025-04-01 16:20:13,207 - INFO - Final validation metrics:
{'f1': 74.19673832782948, 'acc': 85.28745482568027, 'precision': 74.98860424651154, 'recall': 76.86231454456079, 'balanced acc': 76.86231454456079}
2025-04-01 18:00:02,315 - INFO - Num classes: 3
2025-04-01 18:00:02,315 - INFO - Class weights: None
2025-04-01 18:00:02,494 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-01 18:00:02,494 - INFO - Using cuda device
2025-04-01 18:00:02,518 - INFO - Training parameters restored at epoch 48
2025-04-01 18:00:02,538 - INFO - Initializing final Evaluations:

2025-04-01 18:03:01,077 - INFO - Final validation metrics:
{'f1': 74.19673832782948, 'acc': 85.28745482568027, 'precision': 74.98860424651154, 'recall': 76.86231454456079, 'balanced acc': 76.86231454456079}
2025-04-01 18:05:11,742 - INFO - Final test pixel-wise classification metrics:
{'f1': 77.19039574783483, 'acc': 80.92962454826393, 'precision': 78.24450553804677, 'recall': 79.51354627965026, 'balanced acc': 79.51354627965026}
2025-04-05 02:31:09,377 - INFO - Num classes: 3
2025-04-05 02:31:09,381 - INFO - Class weights: None
2025-04-05 02:31:09,536 - INFO - Model architecture:
CombinedModelCNN(
  (unet): Unet(
    (conv1): Sequential(
      (0): Conv2d(1080, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(5, 5))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv2): Sequential(
      (0): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(2, 2))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (conv3): Sequential(
      (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    )
    (upconv3): Sequential(
      (0): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(16, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv2): Sequential(
      (0): Conv2d(32, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(8, 8, kernel_size=(4, 4), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(8, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
    (upconv1): Sequential(
      (0): Conv2d(16, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): ReLU()
      (3): Conv2d(3, 3, kernel_size=(7, 7), stride=(1, 1), padding=(1, 1))
      (4): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (5): ReLU()
      (6): ConvTranspose2d(3, 3, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))
    )
  )
  (san): ImprovedHyperspectralLogisticRegressionModel(
    (spectral_attention): SpectralAttention(
      (fc): Sequential(
        (0): Linear(in_features=1080, out_features=67, bias=True)
        (1): ReLU(inplace=True)
        (2): Linear(in_features=67, out_features=1080, bias=True)
        (3): Sigmoid()
      )
    )
    (linear): Sequential(
      (0): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=1080, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (1): LinearBlock(
        (block): Sequential(
          (0): Linear(in_features=20, out_features=20, bias=True)
          (1): BatchNorm1d(20, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1)
          (3): Dropout(p=0.0, inplace=False)
        )
      )
      (2): Linear(in_features=20, out_features=3, bias=True)
    )
    (logistic): Linear(in_features=3, out_features=3, bias=True)
  )
  (cnn): Sequential(
    (0): Conv2d(6, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (3): Dropout2d(p=0.2, inplace=False)
    (4): Conv2d(64, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (5): ReLU(inplace=True)
    (6): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): Dropout2d(p=0.2, inplace=False)
    (8): Conv2d(32, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (9): ReLU(inplace=True)
    (10): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (11): Dropout2d(p=0.2, inplace=False)
    (12): Conv2d(16, 3, kernel_size=(1, 1), stride=(1, 1))
  )
)
2025-04-05 02:31:09,549 - INFO - Using cuda device
2025-04-05 02:31:09,586 - INFO - Initializing final Evaluations:

